/**
 **********************************************************************************************************************
 * @file    cot_param_type.h
 * @brief   该文件提供参数管理框架所有函数原型
 **********************************************************************************************************************
 */

/* Define to prevent recursive inclusion -----------------------------------------------------------------------------*/

#ifndef _COT_PARAM_TYPE_H_
#define _COT_PARAM_TYPE_H_

/* Includes ----------------------------------------------------------------------------------------------------------*/
#include "./cot_param/cot_param_cfg.h"
#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>

#ifdef __cplusplus
extern "C"
{
#endif

    /* 参数权限属性 */

#define COT_PARAM_ATTR_WR (COT_PARAM_ATTR_READ | COT_PARAM_ATTR_WRITE) /* 读写权限 */
#define COT_PARAM_ATTR_NONE 0X00                                       /* 无读写权限 */
#define COT_PARAM_ATTR_READ 0X01                                       /* 可读权限属性 */
#define COT_PARAM_ATTR_WRITE 0X02                                      /* 可写权限属性 */
#define COT_PARAM_ATTR_RESET 0X04                                      /* 可重置权限属性 */
#define COT_PARAM_ATTR_RANGE 0X10                                      /* 支持最大/最小值校验 */

    typedef int8_t COT_PARAM_INT8_T;
    typedef int16_t COT_PARAM_INT16_T;
    typedef int32_t COT_PARAM_INT32_T;
    typedef int64_t COT_PARAM_INT64_T;
    typedef uint8_t COT_PARAM_UINT8_T;
    typedef uint16_t COT_PARAM_UINT16_T;
    typedef uint32_t COT_PARAM_UINT32_T;
    typedef uint64_t COT_PARAM_UINT64_T;
    typedef float COT_PARAM_FLOAT_T;
    typedef double COT_PARAM_DOUBLE_T;
    typedef char COT_PARAM_STRING_T;

#if COT_PARAM_STRING_MAX_LENGTH >= 256
    typedef uint16_t param_size_t;
#else
typedef uint8_t param_size_t;
#endif

    typedef enum
    {
        COT_PARAM_INT8 = 0,
        COT_PARAM_INT16,
        COT_PARAM_INT32,
#if COT_PARAM_USE_64_BIT_LENGTH
        COT_PARAM_INT64,
#endif
        COT_PARAM_UINT8,
        COT_PARAM_UINT16,
        COT_PARAM_UINT32,
#if COT_PARAM_USE_64_BIT_LENGTH
        COT_PARAM_UINT64,
#endif
        COT_PARAM_FLOAT,
#if COT_PARAM_USE_64_BIT_LENGTH
        COT_PARAM_DOUBLE,
#endif
#if COT_PARAM_USE_STRING_TYPE
        COT_PARAM_STRING,
#endif
    } ParamType_e;

    /* 参数校验结果枚举，用于表示参数值校验的结果 */
    typedef enum
    {
        COT_PARAM_CHECK_OK = 0,   /* 校验成功，参数无范围限制 */
        COT_PARAM_CHECK_OVER_MIN, /* 参数值小于最小值或字符串长度小于最小长度 */
        COT_PARAM_CHECK_OVER_MAX, /* 参数值大于最大值或字符串长度大于最大长度 */
        COT_PARAM_CHECK_OTHER_ERR /* 自定义校验失败或其他错误 */
    } cotParamCheckRet_e;

    /* 参数重置选项枚举，定义参数值超出范围时的处理方式 */
    typedef enum
    {
        COT_PARAM_RESET_NONE = 0, /* 不进行任何处理,保持当前值 */
        COT_PARAM_RESET_DEF,      /* 重置为默认值 */
        COT_PARAM_RESET_MIN,      /* 重置为最小允许值 */
        COT_PARAM_RESET_MAX,      /* 重置为最大允许值 */
        COT_PARAM_RESET_MIN_MAX   /* 根据超出方向重置:
                                   * - 小于最小值时设为最小值
                                   * - 大于最大值时设为最大值 */
    } cotParamResetOpt_e;

    /* 参数类型指针联合体，用于统一处理不同类型参数的指针 */
    typedef union
    {
        COT_PARAM_INT8_T *pInt8;   /* 8位有符号整数指针 */
        COT_PARAM_INT16_T *pInt16; /* 16位有符号整数指针 */
        COT_PARAM_INT32_T *pInt32; /* 32位有符号整数指针 */
#if COT_PARAM_USE_64_BIT_LENGTH
        COT_PARAM_INT64_T *pInt64; /* 64位有符号整数指针 */
#endif
        COT_PARAM_UINT8_T *pUint8;   /* 8位无符号整数指针 */
        COT_PARAM_UINT16_T *pUint16; /* 16位无符号整数指针 */
        COT_PARAM_UINT32_T *pUint32; /* 32位无符号整数指针 */
#if COT_PARAM_USE_64_BIT_LENGTH
        COT_PARAM_UINT64_T *pUint64; /* 64位无符号整数指针 */
#endif
        COT_PARAM_FLOAT_T *pFloat; /* 单精度浮点数指针 */
#if COT_PARAM_USE_64_BIT_LENGTH
        COT_PARAM_DOUBLE_T *pDouble; /* 双精度浮点数指针 */
#endif
#if COT_PARAM_USE_STRING_TYPE
        COT_PARAM_STRING_T *pString; /* 字符串指针 */
        param_size_t *pStringLength; /* 字符串长度指针 */
#endif
        void *pVoid; /* 通用指针,用于类型转换 */
    } cotParamTypePtr_u;

    typedef int (*cotParamCheck_f)(const void *pCurParam);

    /* 参数描述字符串联合体，用于存储参数的描述信息 */
    typedef union
    {
        void *pVoid;       /* 通用指针,用于消除编译警告 */
        size_t textId;     /* 文本资源ID,用于多语言支持 */
        char *pTextString; /* 文本字符串指针,直接存储描述文本 */
    } cotParamDsecStr_u;

    /* 定义无内存的参数结构体信息，存储单个参数的完整信息 */
    typedef struct stuParamInfo
    {
#if (COT_PARAM_NAME_MAX_LENGTH > 1)
        cotParamDsecStr_u name; /* 参数名称,仅当名称最大长度>1时有效 */
#endif
        uint16_t id;                           /* 参数唯一标识符 */
        uint8_t type;                          /* 参数类型,取值见ParamType_e枚举 */
        uint16_t length;                       /* 参数值的字节长度 */
        uint8_t attr;                          /* 参数属性,如读写权限等 */
        cotParamTypePtr_u unCurValuePtr;       /* 当前值的存储位置指针 */
        const cotParamTypePtr_u unDefValuePtr; /* 默认值的存储位置指针 */
        const cotParamTypePtr_u unMinValuePtr; /* 最小值指针
                                                * - 数值类型:最小允许值
                                                * - 字符串类型:最小长度(param_size_t) */
        const cotParamTypePtr_u unMaxValuePtr; /* 最大值指针
                                                * - 数值类型:最大允许值
                                                * - 字符串类型:最大长度(param_size_t) */
#if COT_PARAM_USE_CUSTOM_CHECK
        const cotParamCheck_f pfnParamCheck; /* 自定义校验函数指针
                                              * - 返回0表示校验通过
                                              * - 返回非0表示校验失败 */
#endif
    } cotParamInfo_t;

    typedef int (*cotParamError_f)(const cotParamInfo_t *pParamInfo, cotParamCheckRet_e eCheckResult);
    typedef int (*cotParamLoad_f)(uint8_t *pBuf, uint16_t bufSize, uint16_t *pLength);
    typedef int (*cotParamSave_f)(const uint8_t *pBuf, uint16_t len);

    /*定义参数管理结构体 */
    typedef struct
    {
        cotParamInfo_t *pParamTable; /*!< 参数信息数组表 */
        uint16_t count;              /*!< 参数信息数组元素个数 */
    } cotParamManager_t;

#ifdef __cplusplus
}
#endif

#endif
